"""priority_queue.py
优先队列（Priority Queue）是一种特殊的队列，在优先队列中，每个元素都有一个与之相关的优先级，优先级最高的元素最先出队。如果多个元素有相同的优先级，那么它们按照其在队列中的顺序出队，即先进先出（FIFO）。优先队列常用于操作系统的任务调度、Dijkstra算法、Huffman编码等。

我们可以通过二叉堆（Binary Heap）来实现优先队列。
这里我们将用Python实现一个简单的优先队列，优先级以元素的值为标准，值越大，优先级越高。队列的类将包含以下操作：
入队(enqueue)
出队(dequeue)
获取队列的头部元素(peek)
判断队列是否为空(is_empty)
获取队列的长度(size)。

因为优先队列内部的元素是根据优先级来排序的，
所以它的ASCII表示并不能直接反映元素的出队顺序。
在优先队列中，最高优先级的元素可能会在队列的任何位置。
"""

import heapq


class PriorityQueue:
    def __init__(self):
        self._queue = []
        self._index = 0

    def is_empty(self):
        return not self._queue

    def enqueue(self, priority, item):
        heapq.heappush(self._queue, (-priority, self._index, item))
        self._index += 1

    def dequeue(self):
        return heapq.heappop(self._queue)[-1]

    def peek(self):
        return self._queue[0][-1]

    def size(self):
        return len(self._queue)

if __name__ == '__main__':
    pq = PriorityQueue()
    print(pq.is_empty())  # True

    pq.enqueue(3, 'A')
    pq.enqueue(1, 'B')
    pq.enqueue(2, 'C')
    print(pq.size())  # 3

    print(pq.peek())  # 'A'

    print(pq.dequeue())  # 'A'

    print(pq.size())  # 2
